#ifndef SYSTEMCONFIGMANAGER_H
#define SYSTEMCONFIGMANAGER_H

#include <QObject>
#include <QSettings>
#include <QMutex>
#include <memory>
#include "systemconfig.h"

/**
 * Martin Fowler重构：系统配置管理器（单例模式）
 *
 * 职责：
 * - 确保全局只有一个配置实例
 * - 提供线程安全的配置访问
 * - 自动处理配置的持久化
 * - 提供配置变更通知机制
 *
 * 设计原则：
 * - Singleton Pattern：确保唯一实例
 * - Thread Safety：使用QMutex保护并发访问
 * - Observer Pattern：配置变更时通知所有观察者
 */
class SystemConfigManager : public QObject
{
    Q_OBJECT

public:
    /**
     * 获取单例实例
     * 线程安全的懒汉式单例实现
     */
    static SystemConfigManager& instance();

    /**
     * 销毁单例实例（主要用于测试）
     */
    static void destroyInstance();

    /**
     * 获取当前配置（只读）
     */
    const SystemConfig& getConfig() const;

    /**
     * 更新配置
     * 会自动保存到持久化存储并发出变更信号
     */
    void updateConfig(const SystemConfig& newConfig);

    /**
     * 重置为默认配置
     */
    void resetToDefaults();

    /**
     * 立即保存配置（通常不需要手动调用，updateConfig会自动保存）
     */
    void saveConfig();

    /**
     * 重新加载配置（从持久化存储）
     */
    void reloadConfig();

    /**
     * 检查配置是否已初始化
     */
    bool isInitialized() const;

signals:
    /**
     * 配置变更信号
     * @param oldConfig 旧配置
     * @param newConfig 新配置
     */
    void configChanged(const SystemConfig& oldConfig, const SystemConfig& newConfig);

public slots:
    /**
     * 处理应用程序退出前的配置保存
     */
    void onAboutToQuit();

    // === 窗口状态管理 ===
    /**
     * 保存窗口几何信息
     */
    void setWindowGeometry(const QByteArray& geometry);
    QByteArray getWindowGeometry() const;

    /**
     * 保存停靠窗口状态
     */
    void setDockWidgetState(const QByteArray& state);
    QByteArray getDockWidgetState() const;

    /**
     * 保存停靠窗口可见性
     */
    void setFileBrowserVisible(bool visible);
    bool getFileBrowserVisible() const;

    void setThumbnailVisible(bool visible);
    bool getThumbnailVisible() const;

    /**
     * 保存停靠窗口宽度
     */
    void setFileBrowserWidth(int width);
    int getFileBrowserWidth() const;

    void setThumbnailWidth(int width);
    int getThumbnailWidth() const;

private:
    /**
     * 私有构造函数（单例模式）
     */
    explicit SystemConfigManager(QObject* parent = nullptr);

    /**
     * 禁用拷贝构造和赋值（单例模式）
     */
    SystemConfigManager(const SystemConfigManager&) = delete;
    SystemConfigManager& operator=(const SystemConfigManager&) = delete;

    /**
     * 析构函数
     */
    ~SystemConfigManager();

    // 创建实例的静态方法（用于内部创建）
    static SystemConfigManager* createInstance();

    /**
     * 确保QSettings已初始化
     */
    void ensureSettingsInitialized() const;

    /**
     * 从QSettings加载配置
     */
    void loadConfigImpl();

    /**
     * 保存配置到QSettings
     */
    void saveConfigImpl();

    /**
     * 获取QSettings实例
     */
    QSettings* getSettings();

private:
    static SystemConfigManager* s_instance;
    static QMutex s_mutex;

    SystemConfig m_config;
    QSettings* m_settings;
    bool m_initialized;
    mutable QMutex m_configMutex;  // 保护配置访问的互斥锁
};

/**
 * 便利宏，用于快速访问配置管理器
 */
#define ConfigMgr SystemConfigManager::instance()

#endif // SYSTEMCONFIGMANAGER_H